// 给定一个整数 (32 位有符号整数)，请编写一个函数来判断它是否是 4 的幂次方。

// 示例 1:

// 输入: 16
// 输出: true
// 示例 2:

// 输入: 5
// 输出: false
// 进阶：
// 你能不使用循环或者递归来完成本题吗？

#include <cmath>

// 最直接的方法就是不停的除以4，看最终结果是否为1
class Solution1 {
public:
    bool isPowerOfFour(int num) {
        while (num && num % 4 == 0)
            num /= 4;
        return num == 1;
    }
};

/*
1. n > 0
2. 二进制只有一个1
3. 对3取余为1
*/
class Solution {
public:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & n - 1) == 0 && n % 3 == 1;
    }
};

/*
1. n > 0
2. 二进制只有一个1
3. 二进制1只在奇数位
4. == 的优先级比 & 高
*/
class Solution {
public:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & n - 1) == 0 && (n & 0xAAAAAAAA) == 0;
    }
};

/*
1. n > 0
2. 二进制只有一个1
3. 二进制1只在奇数位
4. == 的优先级比 & 高
*/
class Solution {
public:
    bool isPowerOfFour(int n) {
        return n > 0 && (n & n - 1) == 0 && (n & 0x55555555) == n;
    }
};

// 使用换底公式来做
class Solution2 {
public:
    bool isPowerOfFour(int num) {
        return num > 0 && int(log10(num) / log10(4)) - log10(num) / log10(4) == 0;
    }
};
